package com.hczt.fire.framework.jpa.repository;

import com.hczt.fire.framework.jpa.repository.support.Query;
import com.hczt.fire.framework.jpa.util.Page;
import org.springframework.data.repository.NoRepositoryBean;

import javax.persistence.EntityManager;
import java.io.Serializable;
import java.util.List;

/**
 * @author marvin.ma
 * @create 2017-09-20 22:55
 * @desc 系统基础JPA Dao接口
 **/
@NoRepositoryBean
public interface IBaseRepository {

    /**
     * 获取上下文里的EntityManager
     * @return
     */
    EntityManager getEntityManager();

    /**
     * 通过类创建查询条件
     * @param clazz
     * @return
     */
    Query forClass(Class clazz);

    /**
     * 通过id查询
     * @param clazz
     * @param id
     * @param <E>
     * @return
     */
    <E> E queryById(Class clazz, Serializable id);

    /**
     * 插入记录
     *
     * @param entity
     *            要插入的记录
     */
    <E> void insert(E entity);

    /**
     * 批量插入
     * @param list
     */
    <E> void insertList(List<E> list);

    /**
     * 更新记录
     *
     * @param entity 要更新的记录
     *
     */
    <E> void update(E entity);

    /**
     * 批量更新
     * @param list
     */
    <E> void updateList(List<E> list);

    /**
     * 删除单条记录
     *
     * @param entity
     *    要删除的记录
     */
    <E> void delete(E entity);

    /**
     * 删除记录
     *
     * @param entity
     *            要删除的记录
     */
    void delete(Class entity, String jpqlCondition);

    /**
     * 批量删除记录
     *
     * @param list
     *   要删除的记录
     */
    <E> void deleteList(List<E> list);

    /**
     * 根据Id批量删除记录
     * @param entity
     * @param ids
     * @param <E>
     */
    <E> void deleteByIdList(Class entity, List<E> ids);

    /**
     * 执行更新操作的sql语句
     * @param sql
     * @return
     */
    Integer updateSql(String sql);

    /**
     * 执行更新操作的jpql语句
     * @param jpql
     * @return
     */
    Integer updateJpql(String jpql);

    /***
     *
     * @Method updateJpql
     * @Description 根据传入的带有占位符的sql语句, 做增删改操作 例如
     *              updateJpql("update demo t set t.name=? where t.id=?"
     *              ,{[zx],[23]})
     * @Date 2012-8-9 下午3:38:35
     * @param jpql
     *            占位符式的sql
     * @param paramList
     *            list里面装有[zx, 23]
     */
    void updateJpql(String jpql, List paramList);

    /**
     * 统计记录
     *
     * @param Query
     *            统计条件
     */
    Long getCount(Query Query);

    /**
     * 统计记录
     * @param jpql 统计sql
     * @return
     */
    Long getCount(String jpql);

    /**
     * 执行更新操作的jpql语句
     *
     * @param jpql
     *            要执行的jpql语句
     */
    <E> List<E> query(String jpql);

    /**
     * 执行更新操作的jpql语句实现分页查询
     * @param hql
     * @param pageNo
     * @param rowsPerPage
     * @return
     */
    Page queryPageByJpql(String hql, int pageNo, int rowsPerPage);

    /**
     * 分页执行查询操作的jpql语句
     * @param jpql
     * @param firstResult 起始行
     * @param maxResults 结束行
     * @param <E>
     * @return
     */
    <E> List<E> query(String jpql, int firstResult, int maxResults);

    /**
     * 执行查询操作的sql语句
     *
     * @param sql
     *            要执行的sql语句
     */
    <E> List<E> queryBySql(String sql);

    /**
     * 分页执行查询操作的sql语句
     * @param sql
     * @param firstResult
     * @param maxResults
     * @param <E>
     * @return
     */
    <E> List<E> queryBySql(String sql, int firstResult, int maxResults);

    /**
     * 根据query查找记录
     *
     * @param Query
     *            查询条件
     */
    <E> List<E> query(Query Query);

    /**
     * 分页查询
     *
     * @param Query
     *            查询条件
     * @param pageNo
     *            页号
     * @param rowsPerPage
     *            每页显示条数
     */
    Page queryPage(Query Query, int pageNo, int rowsPerPage);

    /**
     * 根据query查找记录
     *
     * @param Query
     *            查询条件
     * @param firstResult
     *            起始行
     * @param maxResults
     *            结束行
     */
    <E> List<E> query(Query Query, int firstResult, int maxResults);

    /**
     * 查询记录
     *
     * @param clazz
     *            要查询的实体类
     * @param hqlCondition
     *            查询条件
     */
    <E> List<E> query(Class clazz, String hqlCondition);

    /**
     * 查询全部
     * @param clazz
     * @param <E>
     * @return
     */
    <E> List<E> queryAll(Class clazz);

}
